package com.hongying;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class SendConfirmListener {


    public static void main(String[] args) {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //配置rabbitMQ的连接信息
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        //定义连接
        Connection connection = null;
        //定义通道
        Channel channel = null;

        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare("confirmQueue", true, false, false, null);
            channel.exchangeDeclare("directConfirmExchange", "direct", true);
            channel.queueBind("confirmQueue", "directConfirmExchange", "confirmRoutingKey");
            String message = "普通发送者确认模式的测试消息！";
            //启动发送者确认模式
            channel.confirmSelect();
//异步消息确认监听器，需要在消息发送前启动
            channel.addConfirmListener(new ConfirmListener() {
                //消息确认以后的回调方法
                //参数1：被确认的消息编号，从1开始自动递增，用于标记当前是第几个消息
                //参数2：当前消息是否同时确定了多个
                //参数2为true,表示小于等于当前消息编号的所有消息全部被确认，为false，表示只确定了当前消息
                public void handleAck(long l, boolean b) throws IOException {
                    System.out.println("消息被确认了--消息编号" + l + "   是否确认了多条：" + b);
                }

                //消息没有确认的回调方法
                //如果这个方法被执行，表示当前消息没有被确认，需要进行消息的补发
                //参数1：没有确认的消息编号，从1开始自动递增，用于标记当前是第几个消息
                //参数2：当前消息是否同时没有确定了多个
                //如果参数2位true,表示小于当前编号的所有消息都没有发送成功，需要进行消息的补发
                //为false,表示当前编号消息没有发送成功，需要进行补发
                public void handleNack(long l, boolean b) throws IOException {
                    System.out.println("消息没有被确认了--消息编号" + l + "   是否没有确认多条：" + b);
                }
            });
            for (int i = 0; i < 100; i++) {
                channel.basicPublish("directTransactionExchange", "confirmRoutingKey", null, message.getBytes("utf-8"));

            }

            System.out.println("消息发送成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            if (channel != null) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }


}
